﻿/*
SINACOR - BMF&Bovespa
Arquivo: DivergenciaAlocacao.cs
Criado em: 30-mar-2010 10:30:28
Arquiteto Responsável: WGeneroso.prg
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.UI.Bovespa.Alocacao.Communication;
using Sinacor.UI.Bovespa.Alocacao.Model.Enum;

namespace Sinacor.UI.Bovespa.Alocacao.Presenter 
{
    public class DivergenciaAlocacao : BasePresenter<IDivergenciaAlocacao> 
	{
		#region Atributos
        private bool confirmarTodas;
		/// <summary>
		/// Canal de comunicação com serviço de divergencias de alocação / realocação de negócios
		/// </summary>
		private Communication.DivergenciaAlocacao _communicationDivergenciaAlocacao;
		/// <summary>
		/// Filtro de pesquisa de divergencias bindado na tela.
		/// </summary>
		private Model.Parameter.FiltroDivergenciaAlocacao _filtroDivergenciaAlocacao;
		/// <summary>
		/// Lista de divergências na alocação / realocação de negócios
		/// </summary>
		private ModelCollection<Model.DivergenciaAlocacao> _listaDivergenciasAlocacao;
        private Communication.ControleMovimentoOrdens _communicationControleMovimentoOrdens;
        private Model.InformacoesMovimento informacoesMovimento;
		#endregion

		#region Propriedades
		/// <summary>
		/// Filtro de pesquisa de divergencias bindado na tela.
		/// </summary>
		public Model.Parameter.FiltroDivergenciaAlocacao FiltroDivergenciaAlocacao
		{
			get { return _filtroDivergenciaAlocacao; }
			set { _filtroDivergenciaAlocacao = value; }
		}

		/// <summary>
		/// Lista de divergências na alocação / realocação de negócios
		/// </summary>
		public ModelCollection<Model.DivergenciaAlocacao> ListaDivergenciasAlocacao
		{
			get { return _listaDivergenciasAlocacao; }
			set 
            { 
                _listaDivergenciasAlocacao = value;
                this.ListaDivergenciasAlocacao.EnableStateControl = true;
            }
		}
        #endregion

        #region Construtores
        /// <summary>
        /// Construtor parametrizado
        /// </summary>
        /// <param name="view"></param>
        public DivergenciaAlocacao(IDivergenciaAlocacao view) : base(view)
        {
            this._communicationDivergenciaAlocacao = new Communication.DivergenciaAlocacao(this.Session);
            this.ListaDivergenciasAlocacao = new ModelCollection<Model.DivergenciaAlocacao>();
            this.FiltroDivergenciaAlocacao = new Model.Parameter.FiltroDivergenciaAlocacao();
            this.confirmarTodas = false;
            this._communicationControleMovimentoOrdens = new Communication.ControleMovimentoOrdens(this.Session);
            this.informacoesMovimento = this._communicationControleMovimentoOrdens.ObterInformacoesMovimento(new Model.DataMovimento());
        }

        #endregion Construtores

		#region Métodos

		/// <summary>
		/// Atualizar a ciência de divergências de alocação / realocação de negócios
		/// </summary>
		public void AtualizarCienciaDivergenciasAlocacao()
		{
            try
            {
                ModelCollection<Model.DivergenciaAlocacao> alterados;

                if (this.confirmarTodas)
                {
                    alterados = this.ListaDivergenciasAlocacao;
                    confirmarTodas = false;
                }
                else
                    alterados = this.ListaDivergenciasAlocacao.GetChanged();

                this._communicationDivergenciaAlocacao.AtualizarCienciaDivergenciasAlocacao(alterados);
                this.View.InformarSucessoOperacao();
                this.ConsultarDivergenciasAlocacao();
            }
            catch (Exception ex) 
            {
                base.HandleException(ex);
            }
		}

		/// <summary>
		/// Atualiza dados de ciência da divergência.
		/// </summary>
		/// <param name="model"></param>
		public void AtualizarDadosCienciaDivergencia(Model.DivergenciaAlocacao model)
		{
            try
            {
                if (model.IndicadorCiencia == true)
                {
                    model.DataHoraCiencia = DateTime.Now;
                    model.CodigoUsuario = this.Session.UserId;
                    model.Estacao = System.Environment.MachineName;
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
		}

		/// <summary>
		/// Atualiza os dados de ciência para todas as linhas da grid de divergências
		/// </summary>
        public void AtualizarDadosCienciaTodasDivergencias()
		{
            ModelCollection<Model.DivergenciaAlocacao> listaTemp = new ModelCollection<Model.DivergenciaAlocacao>();
            this.confirmarTodas = true;

            try
            {
                foreach (Model.DivergenciaAlocacao item in this.ListaDivergenciasAlocacao)
                {
                    item.IndicadorCiencia = true;
                    this.AtualizarDadosCienciaDivergencia(item);
                    listaTemp.Add(item);
                }

                this.ListaDivergenciasAlocacao = listaTemp;

                this.View.AtualizarListaDivergenciasAlocacao();

            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
		}

		/// <summary>
		/// Consulta lista de divergências conforme filtro de pesquisa.
		/// </summary>
		public void ConsultarDivergenciasAlocacao()
		{
            try
            {
                this.ListaDivergenciasAlocacao = this._communicationDivergenciaAlocacao.ConsultarDivergenciasAlocacao(this.FiltroDivergenciaAlocacao);
                this.View.AtualizarListaDivergenciasAlocacao();
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
		}

		#endregion
	}

}